package middleware

//import (
//	"bytes"
//	"encoding/json"
//	"fmt"
//	"gateway/basic/config"
//	order "gateway/basic/proto/orderproto"
//	"gateway/handler/models"
//	"io"
//	"time"
//
//	"github.com/gin-gonic/gin"
//)
//
//// OperationLogMiddleware 操作日志中间件
//func OperationLogMiddleware() gin.HandlerFunc {
//	return func(c *gin.Context) {
//		// 记录请求开始时间
//		startTime := time.Now()
//
//		// 读取请求体
//		var requestBody []byte
//		if c.Request.Body != nil {
//			requestBody, _ = io.ReadAll(c.Request.Body)
//			c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
//		}
//
//		// 创建响应写入器
//		responseWriter := &responseBodyWriter{
//			ResponseWriter: c.Writer,
//			body:          &bytes.Buffer{},
//		}
//		c.Writer = responseWriter
//
//		// 处理请求
//		c.Next()
//
//		// 计算响应时间
//		responseTime := time.Since(startTime).Milliseconds()
//
//		// 异步记录日志
//		go func() {
//			recordOperationLog(c, requestBody, responseWriter.body.Bytes(), responseTime)
//		}()
//	}
//}
//
//// responseBodyWriter 响应体写入器
//type responseBodyWriter struct {
//	gin.ResponseWriter
//	body *bytes.Buffer
//}
//
//func (w responseBodyWriter) Write(b []byte) (int, error) {
//	w.body.Write(b)
//	return w.ResponseWriter.Write(b)
//}
//
//// recordOperationLog 记录操作日志
//func recordOperationLog(c *gin.Context, requestBody []byte, responseBody []byte, responseTime int64) {
//	// 解析响应
//	var response map[string]interface{}
//	json.Unmarshal(responseBody, &response)
//
//	// 获取用户信息（从请求头或JWT中获取）
//	userID := c.GetHeader("X-User-ID")
//	userName := c.GetHeader("X-User-Name")
//	userType := c.GetHeader("X-User-Type")
//
//	// 如果没有从请求头获取到，尝试从查询参数获取
//	if userID == "" {
//		userID = c.Query("operator_id")
//		userType = c.Query("operator_type")
//	}
//
//	// 设置默认值
//	if userID == "" {
//		userID = "anonymous"
//	}
//	if userName == "" {
//		userName = "匿名用户"
//	}
//	if userType == "" {
//		userType = "unknown"
//	}
//
//	// 确定模块和操作类型
//	module, operation := parseModuleAndOperation(c.Request.URL.Path, c.Request.Method)
//
//	// 确定资源类型和ID
//	resourceType, resourceID := parseResourceInfo(c.Request.URL.Path, requestBody)
//
//	// 确定操作结果
//	result := "success"
//	if c.Writer.Status() >= 400 {
//		result = "failed"
//	}
//
//	// 构建日志记录
//	logReq := &order.CreateOperationLogReq{
//		LogType:       "operation",
//		Module:        module,
//		Operation:     operation,
//		ResourceType:  resourceType,
//		ResourceId:    resourceID,
//		UserId:        userID,
//		UserName:      userName,
//		UserType:      userType,
//		IpAddress:     c.ClientIP(),
//		UserAgent:     c.Request.UserAgent(),
//		RequestMethod: c.Request.Method,
//		RequestUrl:    c.Request.URL.String(),
//		RequestParams: string(requestBody),
//		ResponseCode:  int32(c.Writer.Status()),
//		ResponseTime:  responseTime,
//		Result:        result,
//		Description:   fmt.Sprintf("%s %s", c.Request.Method, c.Request.URL.Path),
//		CreatedAt:     time.Now().Format(time.RFC3339),
//	}
//
//	// 如果有错误信息，添加到日志中
//	if result == "failed" && response["message"] != nil {
//		logReq.ErrorMessage = fmt.Sprintf("%v", response["message"])
//	}
//
//	// 调用RPC服务记录日志
//	ctx := c.Request.Context()
//	_, err := config.OrderClient.CreateOperationLog(ctx, logReq)
//	if err != nil {
//		// 记录日志失败不应该影响主业务
//		fmt.Printf("记录操作日志失败: %v\n", err)
//	}
//}
//
//// parseModuleAndOperation 解析模块和操作类型
//func parseModuleAndOperation(path, method string) (string, string) {
//	// 根据路径确定模块
//	var module string
//	switch {
//	case contains(path, "/user"):
//		module = "user"
//	case contains(path, "/order"):
//		module = "order"
//	case contains(path, "/state-machine"):
//		module = "state_machine"
//	case contains(path, "/operation-log"):
//		module = "operation_log"
//	case contains(path, "/face"):
//		module = "face"
//	default:
//		module = "system"
//	}
//
//	// 根据HTTP方法确定操作类型
//	var operation string
//	switch method {
//	case "GET":
//		operation = "query"
//	case "POST":
//		if contains(path, "/accept") {
//			operation = "accept"
//		} else if contains(path, "/reject") {
//			operation = "reject"
//		} else if contains(path, "/assign") {
//			operation = "assign"
//		} else if contains(path, "/transition") {
//			operation = "transition"
//		} else {
//			operation = "create"
//		}
//	case "PUT":
//		operation = "update"
//	case "DELETE":
//		operation = "delete"
//	default:
//		operation = "unknown"
//	}
//
//	return module, operation
//}
//
//// parseResourceInfo 解析资源信息
//func parseResourceInfo(path string, requestBody []byte) (string, string) {
//	// 尝试从请求体中解析资源ID
//	var requestData map[string]interface{}
//	json.Unmarshal(requestBody, &requestData)
//
//	// 根据路径和请求数据确定资源类型和ID
//	switch {
//	case contains(path, "/order"):
//		resourceType := "order"
//		resourceID := ""
//		if orderID, ok := requestData["order_id"]; ok {
//			resourceID = fmt.Sprintf("%v", orderID)
//		} else if orderID, ok := requestData["orderID"]; ok {
//			resourceID = fmt.Sprintf("%v", orderID)
//		}
//		return resourceType, resourceID
//	case contains(path, "/user"):
//		resourceType := "user"
//		resourceID := ""
//		if userID, ok := requestData["user_id"]; ok {
//			resourceID = fmt.Sprintf("%v", userID)
//		} else if userID, ok := requestData["userID"]; ok {
//			resourceID = fmt.Sprintf("%v", userID)
//		}
//		return resourceType, resourceID
//	default:
//		return "unknown", ""
//	}
//}
//
//// contains 检查字符串是否包含子字符串
//func contains(s, substr string) bool {
//	return len(s) >= len(substr) && s[:len(substr)] == substr ||
//		   len(s) > len(substr) && s[len(s)-len(substr):] == substr ||
//		   len(s) > len(substr) && containsInMiddle(s, substr)
//}
//
//// containsInMiddle 检查字符串中间是否包含子字符串
//func containsInMiddle(s, substr string) bool {
//	for i := 0; i <= len(s)-len(substr); i++ {
//		if s[i:i+len(substr)] == substr {
//			return true
//		}
//	}
//	return false
//}
//
//// CreateOperationLogReq 创建操作日志请求（临时定义，实际应该从proto生成）
//type CreateOperationLogReq struct {
//	LogType       string `json:"log_type"`
//	Module        string `json:"module"`
//	Operation     string `json:"operation"`
//	ResourceType  string `json:"resource_type"`
//	ResourceId    string `json:"resource_id"`
//	UserId        string `json:"user_id"`
//	UserName      string `json:"user_name"`
//	UserType      string `json:"user_type"`
//	IpAddress     string `json:"ip_address"`
//	UserAgent     string `json:"user_agent"`
//	RequestMethod string `json:"request_method"`
//	RequestUrl    string `json:"request_url"`
//	RequestParams string `json:"request_params"`
//	ResponseCode  int32  `json:"response_code"`
//	ResponseTime  int64  `json:"response_time"`
//	Result        string `json:"result"`
//	ErrorMessage  string `json:"error_message"`
//	Description   string `json:"description"`
//	CreatedAt     string `json:"created_at"`
//}
//
